package com.atguigu.gmall.order.service;


import com.atguigu.gmall.model.enums.ProcessStatus;
import com.atguigu.gmall.model.order.OrderInfo;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;
import java.util.Map;

public interface OrderService extends IService<OrderInfo> {
    /**
     * 提交订单，保存订单信息
     * @param orderInfo
     * @return
     */
    Long saveOrderInfo(OrderInfo orderInfo);

    /**
     * 获取订单流水号，用于防止无刷新回退提交订单，切一份存入缓存
     * @param userId
     * @return
     */
    String getTradeNo(String userId);

    /**
     * 核对（和缓存）流水号，正确则删除缓存
     * @param tradeNo
     * @param userId
     * @return
     */
    boolean checkTradeNo(String tradeNo,String userId);

    /**
     * 根据键删除流水号缓存
     * @param userId
     */
    void deleteTradeNo(String userId);

    /**
     * 验证库存
     * @param skuId
     * @param skuNum
     * @return
     */
    boolean checkStock(Long skuId,Integer skuNum);

    /**
     * 处理过期订单
     * @param orderId
     */
    void execExpiredOrder(Long orderId);

    /**
     * 根据订单Id 修改订单的状态
     * @param orderId
     * @param processStatus
     */
    void updateOrderStatus(Long orderId, ProcessStatus processStatus);

    /**
     * 根据订单id 获取订单信息
     * @param orderId
     * @return
     */
    OrderInfo getOrderInfoById(Long orderId);

    /**
     * 封装减库存的方法
     * @param orderId
     */
    void sendOrderStatus(Long orderId);

    /**
     * 根据orderInfo订单信息，封装为减库存的参数，Map
     * @param orderInfo
     * @return
     */
    Map initWareOrder(OrderInfo orderInfo);

    /**
     * 拆单，根据原总订单id，和wareSkuMap中指明的分仓库id 对应的skuIds 进行拆单，生成对应不同仓库的子订单，返回
     * @param orderId
     * @param wareSkuMap
     * @return
     */
    List<OrderInfo> orderSplit(String orderId, String wareSkuMap);

    /**
     * 处理过期订单，而且判断 是否还去发消息关闭支付状态
     * @param orderId
     * @param flag
     */
    void execExpiredOrder(Long orderId, String flag);
}
